#ifndef APP_H
#define APP_H

/*!
 * \file App.h
 * \brief Application qui représente la vue
 * \author Jalal Chaabane
 * \version 0.1
 */

#include "RessourceManager.h"
#include "Input.h"
#include "Drawable.h"
#include <SDL/SDL_framerate.h>
#include <list>

namespace JDL
{
  /*! \namespace JDL
   * Espace de nom regroupant les modules de la librairie
   */
    class App
    {
      /*!
       * \brief classe représentant une application
       */
        public:
      /*! \brief Constructeur
       *
       *  Constructeur de la classe App
       *
       * \param sizex : Largeur de la fenêtre
       * \param sizey : Hauteur de la fenêtre
       */
            App(int sizex, int sizey);
            /*!
	     * \brief Destructeur
	     */
            ~App();
	    /*!
	     * \fn Input	*GetInput()
	     * \brief Permet de récuperer le gestionnaire d'evenement keymapping
	     * \return Retourne le gestionnaire d'évenement de l'application
	     */
            Input       *GetInput();
	    /*!
	     * \fn void SetFramerate(int fps)
	     * \brief Permet de donner un framerate à l'application
	     * \param fps : Donner la valeur en fps
	     */
            void        SetFramerate(int fps);
	    /*!
	     * \fn SDL_Event GetEvent() const
	     * \brief Permet de récuperer le gestionnaire d'evenement
	     * \return retourne le gestionnaire d'évenement
	     */
            SDL_Event   GetEvent() const;
	    /*!
	     * \fn int GetFramerate() const
	     * \brief Permet de récuperer le framerate de l'application
	     * \return Retourne le framerate de l'application
	     */
	    int		GetFramerate() const;
	    /*!
	     * \fn void AddObject(Drawable *obj)
	     * \brief Ajoute un objet Drawable dans la collection
	     * \param obj : L'objet que l'on veut rajouter
	     */
            void        AddObject(Drawable *obj);
	    /*!
	     * \fn void SetIcon(const std::string str)
	     * \brief Modifie l'icone de l'application
	     * \param str : nom du fichier de l'image à charger
	     */
            void        SetIcon(const std::string str);
	    /*!
	     * \fn void SetTitle
	     * \brief Modifie le titre de l'application
	     * \param str: titre
	     */
            void        SetTitle(const std::string str);
	    /*!
	     * \fn SDL_Rect GetSize() const
	     * \brief Permet de récuperer la taille de la fenêtre
	     * \return Retourne un SDL_Rect contenant la taille de la fenetre
	     */
            SDL_Rect    GetSize() const;
	    /*!
	     * \fn void RenderFrame();
	     * \brief Rend la frame courante
	     */
	    void	RenderFrame();
	    /*!
	     * \fn bool isQuit()
	     * \brief Test si l'application est toujours ouverte
	     * \return true si vrai false si faux
	     */
	    bool	isQuit();
	    /*
	     * \fn bool isResize()
	     * \brief Si la fenetre est resize
	     * \return true si vrai false si faux
	     */
	    bool	isResize();

        protected:
            std::string             _title;
            SDL_Surface             *_icon;
            SDL_Rect                _size;
            std::list<Drawable*>    _objs;
            Input                   *_input;
            SDL_Event               _event;
            FPSmanager              *_framerate;
	    SDL_Surface		    *_fond;
            SDL_Surface             *_screen;
	    /*!
	     * \fn void Init()
	     * \brief Initialise l'application
	     */
	    void	Init();
	    /*! \fn void UpdateEvent()
	     * \brief Actualise les évenement
	     */
	    void	UpdateEvent();
    };
}


#endif // APP_H
